
package body telFixe is

-- Implementation du telephone fixe
	task body telFixe is

	-- Numeros du telephone courant
		monNum : Integer := 0;
	-- Indique si le telephone est en cours de communication
		enLigne : boolean := false;
	-- Reponse du standard
		reponseStandard : Integer := 0;
	-- Le canal de communication attribué au fixe quand il est mis en communication
		canalCom : Integer;
	-- Sauvegarde du numero appelé pour pouvoir continuer à l'utiliser hors du accept
		saveNumAppele : Integer;
		

	begin
		loop
			select
			
				accept demanderCom(numAppele : in Integer)
				do
					saveNumAppele := numAppele;
					-- le fait de demander une communication equivaut a avoir decroche le telephone et compose un numero
					enLigne := true;
					put_line("[telephone" & Integer'image(monNum) &"] Je tente d'appeler le telephone" & integer'image(numAppele) & ".");
					
					-- le standard verifie si il peut communiquer avec le telephone demande
					-- reponseStandard : Integer := leStandard.ouvrirCommunication(monNum, numAppele)
					reponseStandard := ouvrirCom(monNum, numAppele);
					-- 1 => les deux interlocuteurs sont en communication l'un avec l'autre
					
				end demanderCom;
				
				case reponseStandard is
					when -2 =>
						put_line("[telephone" & integer'image(monNum) & "] Le telephone" & integer'image(saveNumAppele) & " est occupe.");
					when -3 =>
						put_line("[telephone" & integer'image(monNum) & "] Le telephone" & integer'image(saveNumAppele) & " est sur répondeur. Il sera prévenu que j'ai tenté de le joindre.");
					when -4 =>
						put_line("[telephone" & integer'image(monNum) & "] Le telephone" & integer'image(saveNumAppele) & " ne repond pas.");
					when -5 =>
						put_line("[telephone" & integer'image(monNum) & "] Le telephone" & integer'image(saveNumAppele) & " n'est pas attribué.");
					when others =>
						put_line("[telephone" & integer'image(monNum) & "] Le telephone" & integer'image(saveNumAppele) & " m'a repondu, je peux communiquer avec lui.");
						canalCom := reponseStandard;
				end case;
			or
				-- Attribution d'un numero au telephone
				accept attribuerNumero(numero : in Integer)
				do
					monNum := numero;
				end attribuerNumero;
			or
				accept activerRepondeur
				do
					activerRep(monNum);
				end activerRepondeur;
			or
				accept desactiverRepondeur
				do
					desactiverRep(monNum);
				end desactiverRepondeur;
			or
				accept communiquer
				do
					put("");
				end communiquer;
				-- Chaque telephone envoi 5 messages
				for i in 1..5 loop
					-- mutex locké tant que le message n'a pas été lu
					lockMutex(canalCom);
					put_line("CONVERSATION : [telephone" & integer'image(monNum) & "] message à " & integer'image(saveNumAppele));
					unlockMutex2(canalCom);
				end loop;
				enLigne := false;
			or
				-- Permet à un "appelé" de récupérer les paramètre de la communication qu'il va entreprendre
				accept configurerPourComm(canal : in Integer; numCorrespondant : in Integer)
				do
					canalCom := canal;
					saveNumAppele := numCorrespondant;
					enLigne := true;
				end;
			end select;
		end loop;
		exception
		when E : others =>
			put_line("Erreur dans telFixe");
			put("Exception Identity : ");
			put_line(Exception_Name(Exception_Identity(E)));
			put("Exception Name : ");
			put_line(Exception_Name(E));
			put("Exception message : ");
			put_line(Exception_Message(E));
			put("Exception information : ");
			put_line(Exception_Information(E));
	end telFixe;
	
	-- Ces 2 procédures sont définies pour être appelables depuis le programme C
	procedure lancerConvers(sender : in Integer; receiver : in Integer) is
		
	begin
		tels(sender).communiquer;
		tels(receiver).communiquer;
	end lancerConvers;
	
	procedure configurerCorrespondant(receiver : in Integer; canal : in Integer; numCorrespondant : in Integer) is
		
	begin
		tels(receiver).configurerPourComm(canal, numCorrespondant);
	end configurerCorrespondant;

end telFixe;
